package com.example.threaddemo.fastjson;

import cn.hutool.core.io.FileUtil;
import com.alibaba.fastjson.JSONObject;
import org.junit.Test;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

/**
 * @Author：wlz
 * @Package：com.example.threaddemo.fastjson
 * @Project：threaddemo
 * @name：FastJsonTest
 * @Date：2023/3/30 23:20
 * @Filename：FastJsonTest
 * https://blog.csdn.net/cold___play/article/details/124525519
 */
public class FastJsonTest {
    /**
     * java对象转换为json字符串
     */
    @Test
    public void objToJson() {
        //简单对象转换
        User user = new User("root", "123456");
        //调用toJSONString()
        String userJson = JSONObject.toJSONString(user);
        System.out.println("java类转换为json串：" + userJson);

        //集合转json串
        User user1 = new User("zhangsan", "123456");
        User user2 = new User("lisi", "000");
        List<User> users = new ArrayList<User>();
        users.add(user1);
        users.add(user2);
        //调用toJSONString()
        String usersjson = JSONObject.toJSONString(users);
        System.out.println("集合转json串：" + usersjson);

        //复杂java类转换对象
        UserGroup userGroup = new UserGroup("userGroup", users);
        //调用toJSONString()
        String userGroupJson = JSONObject.toJSONString(userGroup);
        System.out.println("复杂java类转换json串：" + userGroupJson);

        User user3 = JSONObject.parseObject("{\"password\":\"123456\",\"username\":\"root\"}",User.class);
        System.out.println(user3);
    }
    /**
     * json字符串转为java类
     * 注：字符串中使用双引号需要转义 (" --> \"),这里使用的是单引号,易读性会好很多。
     * json串以“{}”包裹，转换为java类时，使用：parseObject();
     * json串以“[]”包裹，转换为java类时，使用：parseArray();
     */
    @Test
    public void jsonToObj(){
        /* json字符串转简单java对象
         * 字符串：{"password":"123456","username":"dmego"}
         */
        String jsonStr1 = "{'password':'123456','username':'ggf'}";
        // 调用parseObject()
        User user = JSONObject.parseObject(jsonStr1, User.class);
        System.out.println("json字符串转简单java对象:"+user.toString());

        /*
         * json字符串转List<Object>对象
         * 字符串：[{"password":"123123","username":"zhangsan"},
         *        {"password":"321321","username":"lisi"}]
         */
        String jsonStr2 = "[{'password':'123123','username':'zhangsan'},{'password':'321321','username':'lisi'}]";
        // 调用parseArray()将字符串转为集合
        List<User> users = JSONObject.parseArray(jsonStr2, User.class);
        System.out.println("json字符串转List<Object>对象:"+users.toString());

        /*json字符串转复杂java对象
         * 字符串：{"name":"userGroup","users":[{"password":"123123","username":"zhangsan"},{"password":"321321","username":"lisi"}]}
         * */
        String jsonStr3 = "{'name':'userGroup','users':[{'password':'123123','username':'zhangsan'},{'password':'321321','username':'lisi'}]}";
        UserGroup userGroup = JSONObject.parseObject(jsonStr3, UserGroup.class);
        System.out.println("json字符串转复杂java对象:"+userGroup);
    }
    /**
     * 将复杂的json串转换为java类
     */
    @Test
    public void jsonToComplexObj() throws IOException {
        // 读取类路径下的caipu.json文件,这里使用了第三方工具hutool进行读取json文件
        // 工具类参见：https://hutool.cn/docs/#/
        String jsonStr = FileUtil.readUtf8String(new File("D:\\springbootproject\\threaddemo\\src\\main\\java\\com\\example\\threaddemo\\fastjson\\caipu.json"));
        System.out.println(jsonStr);
        // 转换为java类
        ResponseData1 resp = JSONObject.parseObject(jsonStr, ResponseData1.class);
        System.out.println(resp);

        // 通过对象操作数据
        // 获取响应码resultcode
        System.out.println(resp.getResultcode());
        // 获取响应数据
        ResponseData1.ResultBean result = resp.getResult();
        System.out.println("result响应数据：" + result);
    }

    /**
     * 对json串的操作
     */
    @Test
    public void operateJson() throws IOException {
        // 读取本地json文本
        String jsonStr = FileUtil.readUtf8String(new File("D:\\springbootproject\\threaddemo\\src\\main\\java\\com\\example\\threaddemo\\fastjson\\caipu.json"));
        // 创建json对象
        JSONObject jsonObj = JSONObject.parseObject(jsonStr);
        // 操作json内容
        // 获取响应码resultcode
        System.out.println(jsonObj.get("resultcode"));
        // 获取响应信息reason
        System.out.println(jsonObj.getString("reason"));
        // 获取data
        JSONObject resJsonObj = (JSONObject)jsonObj.get("result");
        System.out.println(resJsonObj.getString("data"));

    }

}
